﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Domain;
using System.Data.SqlClient;
using System.Data;

namespace DataAcess
{
    public class HabitacionData
    {

        private string literalConexion;

        public HabitacionData(string literalConexion)
        {
            this.literalConexion = literalConexion;
        }

        public LinkedList<Reservacion> ObtenerReservacionXId(int idHabitacion)
        {

            String sqlSelect = "SELECT * FROM Reservacion WHERE id_habitacion=" + idHabitacion;

            SqlConnection conexion = new SqlConnection(literalConexion);
            SqlCommand comandoSeleccionar = new SqlCommand(sqlSelect, conexion);
            conexion.Open();
            SqlDataReader reader = comandoSeleccionar.ExecuteReader();
            LinkedList<Reservacion> reservaciones = new LinkedList<Reservacion>();

            while (reader.Read())
            {
                Reservacion reservacion = new Reservacion();
                reservacion.IdReservacion=reader.GetInt32(0);
                reservacion.IdHabitacion = reader.GetInt32(5);
                reservaciones.AddLast(reservacion);
            }
            return reservaciones;
        }

        public Habitacion PosibilidadDeReservar(LinkedList<Habitacion> habitaciones, DateTime fechaLlegada, DateTime fechaSalida) 
        {
            Boolean posibilidad = false;
            Habitacion habitacion = new Habitacion();
          foreach(Habitacion  habitacionActual in  habitaciones)
          {
              
                  LinkedList<Reservacion> reservaciones = new LinkedList<Reservacion>();
                  reservaciones = ObtenerReservacionXId(habitacionActual.IdHabitacion);
                  posibilidad = FechaPosible(reservaciones, fechaLlegada, fechaSalida);
                  if (posibilidad == true)
                  {
                      habitacion = habitacionActual;
                      break;
                  }
                  else 
                  {
                      break;
                  }
              
          }
          return habitacion;
        }

        public Boolean FechaPosible(LinkedList<Reservacion> reservaciones, DateTime fechaLlegada, DateTime fechaSalida)
        {

            Boolean posibilidad = true;

            foreach (Reservacion reservacionActual in reservaciones)
            {
                if (posibilidad == true)
                {
                    String sqlSelect = "SELECT * FROM DetalleReservacion WHERE id_reservacion=" + reservacionActual.IdReservacion;

                    SqlConnection conexion = new SqlConnection(literalConexion);
                    SqlCommand comandoSeleccionar = new SqlCommand(sqlSelect, conexion);
                    conexion.Open();
                    SqlDataReader reader = comandoSeleccionar.ExecuteReader();
                    LinkedList<TipoHabitacion> tiposHab = new LinkedList<TipoHabitacion>();
                    DateTime fechaActual = new DateTime();
                    fechaActual = DateTime.Today;
                    if (reader.Read())
                    {
                        DetalleReservacion detalleReservacion = new DetalleReservacion();
                        detalleReservacion.IdDetelleReservacion = reader.GetInt32(0);
                        detalleReservacion.FechaLlegada = reader.GetDateTime(1);
                        detalleReservacion.FechaSalida = reader.GetDateTime(2);
                        detalleReservacion.TotalPago = (float)reader.GetDouble(3);

                        int preValorSalida = DateTime.Compare(detalleReservacion.FechaLlegada, fechaSalida);
                        int posValorLlegada = DateTime.Compare(detalleReservacion.FechaSalida, fechaLlegada);

                        if (DateTime.Compare(fechaActual, detalleReservacion.FechaLlegada) == -1)
                        {
                            if (preValorSalida == -1)
                            {
                                if (posValorLlegada == 1)
                                {
                                    posibilidad = false;
                                }
                            }
                        }
                    }//If reader
                }//While
            }//For each

            return posibilidad;

        }

        public String FechaEstado(LinkedList<Reservacion> reservaciones, DateTime fechaLlegada, DateTime fechaSalida)
        {

            Boolean posibilidad = true;
            String estadoHabitacion = "";

            foreach (Reservacion reservacionActual in reservaciones)
            {
                if (posibilidad == true)
                {
                    String sqlSelect = "SELECT * FROM DetalleReservacion WHERE id_reservacion=" + reservacionActual.IdReservacion;

                    SqlConnection conexion = new SqlConnection(literalConexion);
                    SqlCommand comandoSeleccionar = new SqlCommand(sqlSelect, conexion);
                    conexion.Open();
                    SqlDataReader reader = comandoSeleccionar.ExecuteReader();

                    DateTime fechaActual = new DateTime();
                    fechaActual = DateTime.Today;
                    if (reader.Read())
                    {
                        DetalleReservacion detalleReservacion = new DetalleReservacion();
                        detalleReservacion.IdDetelleReservacion = reader.GetInt32(0);
                        detalleReservacion.FechaLlegada = reader.GetDateTime(1);
                        detalleReservacion.FechaSalida = reader.GetDateTime(2);
                        detalleReservacion.TotalPago = (float)reader.GetDouble(3);

                        int preValorSalida = DateTime.Compare(detalleReservacion.FechaLlegada, fechaSalida);
                        int posValorLlegada = DateTime.Compare(detalleReservacion.FechaSalida, fechaLlegada);

                        if (preValorSalida == -1)
                        {
                            if (posValorLlegada == 1)
                            {
                                posibilidad = false;
                                estadoHabitacion = "Ocupada";
                            }//If pos
                        }//If pre
                        
                    }//If reader

                }//While
            }//For each

            if (posibilidad == true)
            {
                estadoHabitacion = "Libre";
            }

            return estadoHabitacion;
        }

        public Habitacion ObtenerHabitacion(int id_habitacion)
        {
            String sqlSelect = "SELECT * FROM Habitacion WHERE id_habitacion=" + id_habitacion;

            SqlConnection conexion = new SqlConnection(literalConexion);
            SqlCommand comandoSeleccionar = new SqlCommand(sqlSelect, conexion);
            conexion.Open();
            SqlDataReader reader = comandoSeleccionar.ExecuteReader();
            Habitacion habitacion = new Habitacion();

            if (reader.Read())
            {

                habitacion.IdHabitacion = reader.GetInt32(0);
                habitacion.IdHotel = reader.GetInt32(1);
                habitacion.TipoHabitacion.IdTipoHab = reader.GetInt32(2);
                habitacion.Estado = reader.GetString(3);

            }
            return habitacion;
        }

        public LinkedList<Habitacion> ObtenerHabitaciones()
        {
            String sqlSelect = "SELECT * FROM Habitacion";

            SqlConnection conexion = new SqlConnection(literalConexion);
            SqlCommand comandoSeleccionar = new SqlCommand(sqlSelect, conexion);
            conexion.Open();
            SqlDataReader reader = comandoSeleccionar.ExecuteReader();
            LinkedList<Habitacion> habitaciones = new LinkedList<Habitacion>();

           while(reader.Read())
            {
                Habitacion habitacion = new Habitacion();
                habitacion.IdHabitacion = reader.GetInt32(0);
                habitacion.IdHotel = reader.GetInt32(1);
                habitacion.TipoHabitacion.IdTipoHab = reader.GetInt32(2);
                TipoHabitacionData tipoHabitacionData = new TipoHabitacionData(literalConexion);
                TipoHabitacion tipoHabitacion = new TipoHabitacion();
                tipoHabitacion = tipoHabitacionData.ObtenerTipoHabitacion(habitacion.TipoHabitacion.IdTipoHab);
                habitacion.TipoHabitacion = tipoHabitacion; 
               habitacion.Estado = reader.GetString(3);
                habitaciones.AddLast(habitacion);
            }
            return habitaciones;
        }
        
       
        public LinkedList<Habitacion> RetornaHabLibres(LinkedList<Habitacion> habitaciones, DateTime fechaLlegada, DateTime fechaSalida)
        {
            Boolean posibilidad = false;
            LinkedList<Habitacion> habitacionesDevolver = new LinkedList<Habitacion>();
            foreach (Habitacion habitacionActual in habitaciones)
            {
                LinkedList<Reservacion> reservaciones = new LinkedList<Reservacion>();
                reservaciones = ObtenerReservacionXId(habitacionActual.IdHabitacion);
                if (reservaciones.Count != 0)
                {
                    posibilidad = FechaPosible(reservaciones, fechaLlegada, fechaSalida);
                    if (posibilidad == true)
                    {
                        habitacionesDevolver.AddLast(habitacionActual);

                    }
                }
                else {
                    habitacionesDevolver.AddLast(habitacionActual);
                }

            }
            return habitacionesDevolver;
        }



        public LinkedList<Habitacion> ObtenerHabitacionXId(int id_tipoHabitacion)
        {
            String sqlSelect = "SELECT * FROM Habitacion WHERE id_tipoHabitacion=" + id_tipoHabitacion;

            SqlConnection conexion = new SqlConnection(literalConexion);
            SqlCommand comandoSeleccionar = new SqlCommand(sqlSelect, conexion);
            conexion.Open();
            SqlDataReader reader = comandoSeleccionar.ExecuteReader();
            LinkedList<Habitacion> habitaciones = new LinkedList<Habitacion>();

            while (reader.Read())
            {
                Habitacion habitacion = new Habitacion();
                habitacion.IdHabitacion = reader.GetInt32(0);
                habitacion.IdHotel = reader.GetInt32(1);
                habitacion.TipoHabitacion.IdTipoHab = reader.GetInt32(2);
                TipoHabitacionData tipoHabitacionData = new TipoHabitacionData(literalConexion);
                TipoHabitacion tipoHabitacion = new TipoHabitacion();
                tipoHabitacion = tipoHabitacionData.ObtenerTipoHabitacion(habitacion.TipoHabitacion.IdTipoHab);
                habitacion.TipoHabitacion = tipoHabitacion;
                // habitacion.Reservacion.IdReservacion = reader.GetInt32(3);
                habitacion.Estado = reader.GetString(3);
                habitaciones.AddLast(habitacion);
            }
            return habitaciones;
        }
    }
}
